home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 August: Tool Chest / Dev.CD Aug 98 TC.toast / Tool Chest / Testing & Debugging / Virtual User / Virtual User Current Release / Examples / External Tool Templates / CPlus Tool Template / List.cp < prev    next >
Encoding:
Text File  |  1998-06-04  |  7.9 KB  |  400 lines  |  [TEXT/MPS ]

  1. /*
  2.  *    File:        List.cp
  3.  *
  4.  *    Contains:    xxx put contents here xxx
  5.  *
  6.  *    Written by:    Rick Violet
  7.  *
  8.  *    Copyright:    © 1992 by Apple Computer, Inc., all rights reserved.
  9.  *
  10.  *    Change History (most recent first):
  11.  *
  12.  *                11/18/92    RV        xxx put comment here xxx
  13.  *
  14.  *    To Do:
  15.  */
  16.  
  17. //—————————————————————————————————————————————————————————————
  18. #include "List.h"
  19.  
  20. #ifndef __TYPES__            
  21. #include <Types.h>        
  22. #endif
  23.  
  24. #ifndef __MEMORY__            
  25. #include <Memory.h>        
  26. #endif
  27.  
  28.  
  29. //******************************************************************************
  30. //——————————————————————————————————————————————————————————————————————————————
  31. ListNode::ListNode( Object* pObject )
  32. {
  33.     fNextNode = nil;
  34.     fPrevNode = nil;
  35.     fNodeObject = pObject;
  36. }
  37.  
  38. //——————————————————————————————————————————————————————————————————————————————
  39. ListNode::~ListNode(void)
  40. {
  41. }
  42.  
  43. //******************************************************************************
  44. //——————————————————————————————————————————————————————————————————————————————
  45. List::List(void)
  46. {
  47.     fFirstNode = nil;
  48.     fLastNode = nil;
  49.     fCount = 0;
  50. }
  51.  
  52. //——————————————————————————————————————————————————————————————————————————————
  53. List::~List(void)
  54. {
  55. }
  56.  
  57. //——————————————————————————————————————————————————————————————————————————————
  58. void    
  59. List::AddAsFirst( Object* pObject )
  60. {
  61.     ListNode*    tNode = new ListNode( pObject );
  62.  
  63.     if( !tNode )
  64.     {
  65.         return;
  66.     }
  67.  
  68.     if( fFirstNode == nil )
  69.     {
  70.         fFirstNode = tNode;
  71.         fLastNode = tNode;
  72.         tNode->SetNext( nil );
  73.         tNode->SetPrev( nil );
  74.     }
  75.     else 
  76.     {
  77.         fFirstNode->SetPrev( tNode );
  78.         tNode->SetNext( fFirstNode );
  79.         tNode->SetPrev( nil );
  80.         fFirstNode = tNode;
  81.     }
  82.     fCount++;
  83. }
  84.  
  85. //——————————————————————————————————————————————————————————————————————————————
  86. void    
  87. List::AddAsLast( Object* pObject )
  88. {
  89.     ListNode*    tNode = new ListNode( pObject );
  90.     if( !tNode )
  91.     {
  92.         return;
  93.     }
  94.  
  95.     if( fFirstNode == nil )
  96.     {
  97.         fFirstNode = tNode;
  98.         fLastNode = tNode;
  99.         tNode->SetNext( nil );
  100.         tNode->SetPrev( nil );
  101.     }
  102.     else 
  103.     {
  104.         fLastNode->SetNext( tNode );
  105.         tNode->SetNext( nil );
  106.         tNode->SetPrev( fLastNode );
  107.         fLastNode = tNode;
  108.     }
  109.     fCount++;
  110. }
  111.  
  112. //——————————————————————————————————————————————————————————————————————————————
  113. void    
  114. List::Insert( Object* pObject, short pIndex )
  115. {
  116.     ListNode*     tLeadingNode;
  117.     ListNode*     tFollowingNode;
  118.     ListNode*    tNode;
  119.     ListNode*    tTheNode;
  120.     
  121.     tTheNode = new ListNode( pObject );        //———— Make new node containing pObject
  122.     if( !tTheNode )
  123.     {
  124.         return;
  125.     }
  126.  
  127.  
  128.     if( fFirstNode == nil )                    //———— Is the list empty? 
  129.     {
  130.         fFirstNode = tTheNode;                //———— the list is empty
  131.         fLastNode = tTheNode;                //———— put the new node in and exit
  132.         fCount = 1;
  133.         return;
  134.     }
  135.                                             //————    The list is not empty
  136.     if( pIndex <= 0 )                        //————    Is pIndex zero or negative? 
  137.     {                    
  138.         tLeadingNode = fLastNode;            //————    pIndex is zero or negative
  139.         tFollowingNode = nil;                //————    add to the end of the list
  140.     }
  141.     else
  142.     {
  143.         tNode = fFirstNode;                    //———— advance tNode down the list
  144.                                             //———— until indexed node is found
  145.         for( short i = 1; i < pIndex; i++ )
  146.         {
  147.             if( !tNode )                     //———— pIndex beyond last node?
  148.             {
  149.                 tLeadingNode = fLastNode;    //———— reached the end of the list 
  150.                 tFollowingNode = nil;        //———— before indexed node was found
  151.                 break;                        //———— append to list as default
  152.             }
  153.             else
  154.             {
  155.                 tNode = tNode->GetNext();    //———— advance tNode to the next node
  156.             }
  157.         }
  158.         tLeadingNode = tNode->GetPrev();    //———— setup to bump indexed node down and 
  159.         tFollowingNode = tNode;                //———— put the new node at indexed position
  160.  
  161.     }
  162.     
  163.     if( tLeadingNode )                        //———— link with preceding node
  164.     {
  165.         tLeadingNode->SetNext( tTheNode );    
  166.     }
  167.     
  168.     tTheNode->SetPrev( tLeadingNode );
  169.     
  170.     if( tFollowingNode )                    //———— link with following node
  171.     {
  172.         tFollowingNode->SetPrev( tTheNode );
  173.     }
  174.     tTheNode->SetNext( tFollowingNode );
  175.     
  176.     if( tFollowingNode == fFirstNode )        //———— reassign fFirstNode if needed
  177.     {
  178.         fFirstNode = tTheNode;
  179.     }
  180.     else
  181.     {
  182.         if( tLeadingNode == fLastNode )        //———— reassign fLastNode if needed
  183.         {
  184.             fLastNode = tTheNode;
  185.         }
  186.     }
  187.     fCount++;                                //———— keep track of how many nodes
  188. }
  189.  
  190. //——————————————————————————————————————————————————————————————————————————————
  191. void    
  192. List::Remove( Object* pObject )
  193. {
  194.     ListNode* tNode;
  195.     ListNode* tTheNode;
  196.     
  197.      tTheNode = FindNode( pObject );
  198.     if( tTheNode )
  199.     {
  200.         tNode = tTheNode->GetPrev();
  201.         if( tNode )    // remove from forward chain
  202.         {
  203.             tNode->SetNext( tTheNode->GetNext() );
  204.         }
  205.         
  206.         tNode = tTheNode->GetNext();
  207.         if( tNode )    // remove from backward chain
  208.         {
  209.             tNode->SetPrev( tTheNode->GetPrev() );
  210.         }
  211.         
  212.         if( fFirstNode == tTheNode )        // are we removing the first node?
  213.         {
  214.             if( fLastNode == tTheNode )        // and the last node?
  215.             {
  216.                 fFirstNode = nil;            // then make the list empty
  217.                 fLastNode = nil;
  218.             }
  219.             else                            // we're removing only the first node
  220.             {
  221.                 fFirstNode = tTheNode->GetNext();
  222.             }
  223.         }
  224.         else                                // we're not removing the first node
  225.         {
  226.             if( fLastNode == tTheNode )        // are we removing the last node?
  227.             {
  228.                 fLastNode = tTheNode->GetPrev();
  229.             }
  230.         }
  231.         delete tTheNode;
  232.         fCount--;
  233.     }
  234. }
  235.  
  236. //——————————————————————————————————————————————————————————————————————————————
  237. void 
  238. List::RemoveAll(void)
  239. {
  240.     ListNode*    tNode2;
  241.     ListNode*    tNode;
  242.     
  243.     tNode = fFirstNode;
  244.     if( tNode )
  245.     {
  246.         do
  247.         {
  248.             tNode2 = tNode->GetNext();
  249.             delete tNode;
  250.             tNode = tNode2;
  251.         }
  252.         while( tNode );
  253.         
  254.         fFirstNode = nil;
  255.         fLastNode = nil;
  256.         fCount = 0;
  257.     }
  258. }
  259.  
  260. //——————————————————————————————————————————————————————————————————————————————
  261. void 
  262. List::DisposeAll(void)
  263. {
  264.     Object*            tObject;
  265.     ListNode*        tNode2;
  266.     ListNode*        tNode;
  267.     
  268.     tNode = fFirstNode;
  269.     if( tNode )
  270.     {
  271.         do
  272.         {
  273.             tNode2 = tNode->GetNext();
  274.             tObject = tNode->GetNodeObject();
  275.             delete tObject;
  276.             delete tNode;
  277.             tNode = tNode2;
  278.         }
  279.         while( tNode );
  280.         fCount = 0;
  281.     }
  282. }
  283.  
  284. //——————————————————————————————————————————————————————————————————————————————
  285. ListNode* 
  286. List::FindNode( Object* pObject )
  287. {
  288.     ListNode*    tNode;
  289.     
  290.      tNode = fFirstNode;
  291.     if( tNode )                        // Start with the first node
  292.     {
  293.         do                                            // Loop through each node
  294.         {
  295.             if( tNode->GetNodeObject() == pObject )    // return the found node
  296.             {
  297.                 return tNode;
  298.             }
  299.             tNode = tNode->GetNext();
  300.         }
  301.         while( tNode );
  302.     }
  303.     return nil;                                        // return nil if not found
  304. }
  305.  
  306. //——————————————————————————————————————————————————————————————————————————————
  307. short 
  308. List::GetIndexOf( Object* pObject )
  309. {
  310.     ListNode*    tNode;
  311.     short        tIndex;
  312.     
  313.     tNode = fFirstNode;
  314.     if( tNode )                        // Start with the first node
  315.     {
  316.         tIndex = 0;
  317.         do                                            // Loop through each node
  318.         {
  319.             if( tNode->GetNodeObject() == pObject )    // return the found node
  320.             {
  321.                 return tIndex;
  322.             }
  323.             tIndex++;
  324.             tNode = tNode->GetNext();
  325.         }
  326.         while( tNode );
  327.     }
  328.     return -1;                                        // return -1 if not found
  329. }
  330.  
  331. //——————————————————————————————————————————————————————————————————————————————
  332. Object* 
  333. List::GetFirst(void)
  334. {
  335.     if( fFirstNode )
  336.     {
  337.         return fFirstNode->GetNodeObject();
  338.     }
  339.     else
  340.     {
  341.         return nil;
  342.     }
  343. }
  344.  
  345. //——————————————————————————————————————————————————————————————————————————————
  346. Object* 
  347. List::GetIndexed( short pIndex )
  348. {
  349.     ListNode*    tNode = fFirstNode;
  350.     for( short i = 0; i < pIndex; i++ )
  351.     {
  352.         if( !tNode ) 
  353.         {
  354.             return nil;
  355.         }
  356.         tNode = tNode->GetNext();
  357.     }
  358.     return tNode->GetNodeObject();
  359. }
  360.  
  361. //******************************************************************************
  362. //——————————————————————————————————————————————————————————————————————————————
  363. Loop::Loop( List* pList )
  364. {
  365.     fList = pList;
  366.     fCurrNode = pList->GetFirstNode();
  367. }
  368.  
  369. //——————————————————————————————————————————————————————————————————————————————
  370. Loop::~Loop()
  371. {
  372. }
  373.  
  374. //——————————————————————————————————————————————————————————————————————————————
  375. void
  376. Loop::Reset( List* pList = nil )
  377. {
  378.     if( pList )
  379.     {
  380.         fList = pList;
  381.     }
  382.     fCurrNode = fList->GetFirstNode();
  383. }
  384.  
  385. //——————————————————————————————————————————————————————————————————————————————
  386. Object*
  387. Loop::GetNext(void)
  388. {
  389.     ListNode*    tNode;
  390.     
  391.     if( fCurrNode == nil )
  392.     {
  393.         return nil;
  394.     }
  395.         
  396.     tNode = fCurrNode;
  397.     fCurrNode = fCurrNode->GetNext();
  398.     return tNode->GetNodeObject();
  399. }
  400.